﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SISCON.Dao;
using SISCON.Model;
using SISCON.Common;
using log4net;
using SISCON.Vo;
using SISCON.Bl;

namespace SISCON.Bl
{
    public class CourseBL
    {

        private static ILog _Logger = LogManager.GetLogger(typeof(CourseBL));
        private CourseDAO _CourseDAO = new CourseDAO();
        private UserBL _UserBL = new UserBL();
        
        /// <summary>
        /// Valida los usuarios que tienen acceso al metodo GetAllCourses y manda a llamar al dao correspondiente
        /// </summary>
        /// <param name="sessionUUID">Sesion del sistema</param>
        /// <returns>Lista de Courses</returns>
        public List<Course> GetAllCourses(string sessionUUID)
        {
            try
            {
                _UserBL.RequireRole(sessionUUID, Role.READ_ACCESS, Role.COURSES);
                return _CourseDAO.GetAllCourses();
            }
            catch (Exception ex)
            {
                if (!(ex is SISCONException))
                {
                    _Logger.Error("Error in GetAllCourses()", ex);
                }
                throw ex;
            }
        }

        /// <summary>
        /// Valida los usuarios que tienen acceso al metodo GetCourse y manda a llamar al Dao correspondiente
        /// </summary>
        /// <param name="sessionUUID">Sesion del sistema</param>
        /// <param name="courseCode">Codigo del curso</param>
        /// <param name="courseName">Nombre del curso</param>
        /// <returns>Curso</returns>
        public Course GetCourse(string sessionUUID, string courseCode, string courseName)
        {
            try
            {
                _UserBL.RequireRole(sessionUUID, Role.READ_ACCESS, Role.COURSES);
                return _CourseDAO.GetCourse(courseCode, courseName);
            }
            catch (Exception ex)
            {
                if (!(ex is SISCONException))
                {
                    _Logger.Error("Error in GetAllCourses()", ex);
                }
                throw ex;
            }
        }

        /// <summary>
        /// Valida los usuarios que tienen acceso al metodo GetCoursesByName y manda a llamar al Dao correspondiente
        /// </summary>
        /// <param name="sessionUUID">Sesion del sistema</param>
        /// <param name="courseName">Nombre del curso</param>
        /// <returns>Lista de cursos</returns>
        public List<Course> GetCoursesByName(string sessionUUID, string courseName)
        {
            try
            {
                long userId = _UserBL.RequireRole(sessionUUID, Role.READ_ACCESS, Role.COURSES);
                return _CourseDAO.GetCoursesByName(courseName, userId);
            }
            catch (Exception ex)
            {
                if (!(ex is SISCONException))
                {
                    _Logger.Error("Error in GetCoursesByName()", ex);
                }
                throw ex;
            }
        }

        /// <summary>
        /// Valida los usuarios que tienen acceso al metodo GetCoursesByKey y manda a llamar al Dao correspondiente
        /// </summary>
        /// <param name="sessionUUID">Sesion del sistema</param>
        /// <param name="courseKey">Clave del curso</param>
        /// <returns>Lista de cursos</returns>
        public List<Course> GetCoursesByKey(string sessionUUID, string courseKey)
        {
            try
            {
                long userId = _UserBL.RequireRole(sessionUUID, Role.READ_ACCESS, Role.COURSES);
                return _CourseDAO.GetCoursesByKey(courseKey, userId);
            }
            catch (Exception ex)
            {
                if (!(ex is SISCONException))
                {
                    _Logger.Error("Error in GetCoursesByName()", ex);
                }
                throw ex;
            }
        }

        /// <summary>
        /// Valida los usuarios que tienen acceso al metodo SaveCourse y manda a llamar al Dao correspondiente
        /// </summary>
        /// <param name="sessionUUID">Sesion del sistema</param>
        /// <param name="modifiedCourseId">Id del curso</param>
        /// <param name="courseCode">Codigo del curso</param>
        /// <param name="courseNumber">Numero del curso</param>
        /// <param name="courseName">Nombre del curso</param>
        /// <param name="isActive">Indica si el curso esta activo o no</param>
        /// <returns>Regresa si fue posible almacenar el curso</returns>
        public long SaveCourse(string sessionUUID, string modifiedCourseId, string courseCode, string courseNumber, string courseName, bool isActive, string userId)
        {
            try
            {
                _UserBL.RequireRole(sessionUUID, Role.READ_ACCESS, Role.COURSES);
                return _CourseDAO.SaveCourse(modifiedCourseId, courseCode, courseNumber, courseName, isActive, long.Parse(userId));
            }
            catch (Exception ex)
            {
                if (!(ex is SISCONException))
                {
                    _Logger.Error("Error in SaveDepartment()", ex);
                }
                throw ex;
            }
        }

        /// <summary>
        /// Valida los usuarios que tienen acceso al metodo DeleteCourse y manda a llamar al Dao correspondiente
        /// </summary>
        /// <param name="sessionUUID">Sesion del sistema</param>
        /// <param name="courseId">Id interno del curso que se desea eliminar</param>
        public void DeleteCourse(string sessionUUID, string courseId)
        {
            try
            {
                _UserBL.RequireRole(sessionUUID, Role.READ_ACCESS, Role.COURSES);
                _CourseDAO.DeleteCourse(courseId);
            }
            catch (Exception ex)
            {
                if (!(ex is SISCONException))
                {
                    _Logger.Error("Error in DeleteCourse()", ex);
                }
                throw ex;
            }
        }


    }
}